package com.caijinbang.study.repository;

import com.caijinbang.study.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;

/**
 * 用户接口类
 *
 * @author caijb
 * @version 1.0.0
 * @date 2018-04-22 11:59
 */
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User>, Serializable {

    /**
     * 根据用户名称查询用户
     * <p>
     * 使用 @Query是用来配置自定义SQL的注解,后面参数nativeQuery = true才是表明了使用原生的sql,
     * 如果不配置，默认是false，则使用HQL查询方式
     *
     * @param userName
     * @return
     */
    @Query(value = "SELECT * FROM user u WHERE u.user_name=?1", nativeQuery = true)
    public List<User> queryUserByUserName(String userName);

    /**
     * 根据用户名称和电话号码删除用户
     * <p>
     * 使用 @Query 配合 @Modifying 注解一共使用，则可以完成数据的删除、添加、更新操作.
     * 注意 :  SpringDataJPA自定义SQL时需要在对应的接口或者调用接口的地方添加事务注解@Transactional，
     * 来开启事务自动化管理
     *
     * @param userName
     * @param phone
     */
    @Query(value = "DELETE FROM user u WHERE u.user_name=?1 AND u.phone=?2 ", nativeQuery = true)
    @Modifying
    @Transactional(rollbackFor = Exception.class)
    public void deleteByUserNameAndAndPhone(String userName, String phone);

}
